#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>

void handler(int signo)
{
    printf("我是父进程, 我的pid为:%d, 捕捉的信号为:%d\n", getpid(), signo);
    // 1 如果有多个子进程同时退出呢？？
    // 使用while(1)一直进行等待

    // 2有很多子进程，只有一部分退出了
    // 如果以阻塞等待，此时父进程就会在这里阻塞
    // while(1) waitpid(-1, NULL, 0);

    // 只有按照下面的方法才是正确的。加入WNIHANG，非阻塞等待，没有退出我就不管
    // 当返回值为0的时候，break
    int status = 0;
    while (1)
    {
        pid_t subid = waitpid(-1, &status, WNOHANG);
        printf("childpid:%d, exitcode:%d, child exitsignal:%d\n", subid, (status >> 8) & 0xff, status & 0x7f);
        if (subid <= 0)
            break;
    }
}

int main()
{
    // // 1. 自定义SIGCHLD信号行为
    // signal(SIGCHLD, handler);
    // 2.SIG_IGN忽略SIGCHLD，让僵尸进程自动清理，不通知父进程
    signal(SIGCHLD, SIG_IGN);

    printf("我是父进程, 我的pid为:%d\n", getpid());
    pid_t id = fork();

    // 子进程
    if (id == 0)
    {
        printf("我是子进程, 我的pid为:%d, ppid为%d\n", getpid(), getppid());
        sleep(5);
        exit(2);
    }

    // 父进程
    while (1)
    {
        sleep(1);
    }
    return 0;
}